/**
 * @(#)ChineseParser.java
 *
 * ChineseParser application
 *
 * @author Omar Pinto
 * @version 1.00 2011/11/21
 */
import java.util.ArrayList;
import java.util.StringTokenizer;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ChineseParser extends JPanel implements ActionListener{
	private JTextArea area1=new JTextArea(15, 45);
	private JTextArea area2=new JTextArea(15, 45);
	private ArrayList<Entrada> diccionario;

	public ChineseParser(ArrayList<Entrada> diccionario){
		this.diccionario=diccionario;
		this.setLayout(new BorderLayout());

		area1.setFont(new Font("Arial Unicode MS", Font.PLAIN, 18));

		JToolBar herramientas=new JToolBar();
		herramientas.add(crearOpcion("Formatear"));
		herramientas.add(crearOpcion("Seleccionar"));
		herramientas.add(crearOpcion("Copiar"));

		this.add(herramientas, BorderLayout.NORTH);
		this.add(new JScrollPane(area1), BorderLayout.CENTER);
	}

	private JButton crearOpcion(String nombre){
		JButton boton=new JButton(nombre);
		boton.setActionCommand(nombre);
		boton.addActionListener(this);
		return boton;
	}

	public void actionPerformed(ActionEvent evt){
		String comando=evt.getActionCommand();
		if(comando.equals("Formatear")){
			formatearTexto();
		}else{
			JOptionPane.showMessageDialog(null, "Funcionalidad no implementada");
		}
	}

	public void formatearTexto(){
		String texto=editor.getText();
		area1.setText("");
		area1.append("<table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\">\n");
		area1.append("\t<tr>\n");
		area1.append("\t\t<td align=\"center\" width=\"60%\"><b>Chino</b></td>\n");
		area1.append("\t\t<td align=\"center\" width=\"40%\"><b>Idioma traducido</b></td>\n");
		area1.append("\t</tr>\n");

		boolean anterior=false;

		StringTokenizer lineas=new StringTokenizer(texto, "\n", true);
		while(lineas.hasMoreTokens()){
			String l=lineas.nextToken();

			if(l.equals("\n")){
				if(anterior){
					editor.append("</table>\n");
					editor.append("<br>\n");
					editor.append("<br>\n");
					editor.append("<table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\">\n");
				}else{
					anterior=true;
					continue;
				}
			}else{
				editor.append("\t<tr>\n");
				editor.append("\t\t<td align=\"center\" width=\"60%\">\n");

				formatearLinea(l);

				editor.append("\t\t</td>\n");
				editor.append("\t\t<td align=\"center\" class=\"traduccion\" width=\"40%\">traduccion</td>\n");
				editor.append("\t</tr>\n");
				anterior=false;
			}
		}
		editor.append("</table>");
	}

	public void formatearLinea(String linea){
		ArrayList<Entrada> lista=traducirFrase(linea);

		editor.append("\t\t\t<table>\n");
		editor.append("\t\t\t\t<tr>\n");

		for(int k=0; k<lista.size(); k++){
			editor.append("\t\t\t\t\t<td align=\"center\" class=\"romano\">"+lista.get(k).getRomanizacion()+"</td>\n");
		}
		editor.append("\t\t\t\t</tr>\n");
		editor.append("\t\t\t\t<tr>\n");

		for(int k=0; k<lista.size(); k++){
			Entrada e=lista.get(k);
			if(e.getTipeado().equals("?")){
				editor.append("\t\t\t\t\t<td align=\"center\" class=\"chino\">"+e.getSimplificado()+"</td>\n");
			}else if(e.getAcepciones()==null){
				editor.append("\t\t\t\t\t<td align=\"center\" class=\"chino\"><a href=\"#\" title=\"?\">"+e.getSimplificado()+"</a></td>\n");
			}else{
				editor.append("\t\t\t\t\t<td align=\"center\" class=\"chino\"><a href=\"#\" title=\""+e.getAcepciones()+"\">"+e.getSimplificado()+"</a></td>\n");
			}
		}
		editor.append("\t\t\t\t</tr>\n");
		editor.append("\t\t\t</table>\n");
	}

	public ArrayList<Entrada> traducirFrase(String frase){
		ArrayList<Entrada> resultado=new ArrayList<Entrada>();

		for(int i=0, p=1; i<frase.length(); i+=p){
			boolean encontrado=false;

//			editor.append("\n");

			for(int t=frase.length(); t>i; t--){
				String cadena=frase.substring(i, t);
//				editor.append(cadena+"\n");
				Entrada e=buscarCadena(cadena, true);

//				if(e==null){
//					e=buscarCadena(cadena, false);
//					System.out.println("No se habia encontrado, y ahora: "+(e==null));
//				}

				if(e!=null){
					resultado.add(e);
//					editor.append(cadena+"\t"+e.getRomanizacion()+"\t"+e.getAcepciones()+"\n");
					encontrado=true;
					p=t-i;
					break;
				}
			}
			if(!encontrado){
				String caracter=frase.substring(i, i+1);
				resultado.add(new Entrada(caracter, caracter, "?", null));
//				editor.append(frase.substring(i, i+1)+"\t?\n");
			}
		}
		return resultado;
	}

	public Entrada buscarCadena(String cadena, boolean tradicional){
		float mitad=diccionario.size()/2;
		int indice=Math.round(mitad);

//		editor.append("\t"+cadena+"\n");

		while(Math.round(mitad)>0){
			Entrada e=diccionario.get(indice);

			String palabra=null;
			if(tradicional){
				palabra=e.getTradicional();
			}else{
				palabra=e.getSimplificado();
			}

			int comparacion=cadena.compareTo(palabra);

//			editor.append(indice+"\t"+mitad+"\t"+Math.round(mitad)+"\t"+simp+"\n");
			if(comparacion==0){
				return e;
			}else{
				mitad=mitad/2;

				if(comparacion<0){
					indice=indice-Math.round(mitad);
				}else{
					indice=indice+Math.round(mitad);
				}
			}
		}
		return null;
	}

	public void analizar(){
		String entrada=editor.getText();
		String salida="";

		StringTokenizer lineas=new StringTokenizer(entrada, "\n");
		while(lineas.hasMoreTokens()){
			String cadena=lineas.nextToken();
			salida+=cadena+" = "+ cadena.length()+"\n";
		}
		editor.setText(salida);
	}
}
